<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Eigen: Preprocessor directives</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  $(document).ready(function() { init_search(); });
/* @license-end */
</script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js", "TeX/AMSmath.js", "TeX/AMSsymbols.js"],
    jax: ["input/TeX","output/HTML-CSS"],
});
</script>
<script type="text/javascript" async="async" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="eigendoxy.css" rel="stylesheet" type="text/css">
<!--  -->
<script type="text/javascript" src="eigen_navtree_hacks.js"></script>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="Eigen_Silly_Professor_64x64.png"/></td>
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname"><a href="http://eigen.tuxfamily.org">Eigen</a>
   &#160;<span id="projectnumber">3.4.90 (git rev 67eeba6e720c5745abc77ae6c92ce0a44aa7b7ae)</span>
   </div>
  </td>
   <td>        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.svg"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.svg" alt=""/></a>
          </span>
        </div>
</td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
/* @license-end */
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('TopicPreprocessorDirectives.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="PageDoc"><div class="header">
  <div class="headertitle">
<div class="title">Preprocessor directives </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p>You can control some aspects of Eigen by defining the preprocessor tokens using <code>#define</code>. These macros should be defined before any Eigen headers are included. Often they are best set in the project options.</p>
<p>This page lists the preprocessor tokens recognized by Eigen.</p>
<h1><a class="anchor" id="TopicPreprocessorDirectivesMajor"></a>
Macros with major effects</h1>
<p>These macros have a major effect and typically break the API (Application Programming Interface) and/or the ABI (Application Binary Interface). This can be rather dangerous: if parts of your program are compiled with one option, and other parts (or libraries that you use) are compiled with another option, your program may fail to link or exhibit subtle bugs. Nevertheless, these options can be useful for people who know what they are doing.</p>
<ul>
<li><b>EIGEN2_SUPPORT</b> and <b>EIGEN2_SUPPORT_STAGEnn_xxx</b> are disabled starting from the 3.3 release. Defining one of these will raise a compile-error. If you need to compile Eigen2 code, <a href="http://eigen.tuxfamily.org/index.php?title=Eigen2">check this site</a>.</li>
<li><b>EIGEN_DEFAULT_DENSE_INDEX_TYPE</b> - the type for column and row indices in matrices, vectors and array (<a class="el" href="structEigen_1_1EigenBase.html#a554f30542cc2316add4b1ea0a492ff02" title="The interface type of indices.">DenseBase::Index</a>). Set to <code>std::ptrdiff_t</code> by default.</li>
<li><b>EIGEN_DEFAULT_IO_FORMAT</b> - the <a class="el" href="structEigen_1_1IOFormat.html" title="Stores a set of parameters controlling the way matrices are printed.">IOFormat</a> to use when printing a matrix if no IOFormat is specified. Defaults to the IOFormat constructed by the default constructor <a class="el" href="structEigen_1_1IOFormat.html#acdcc91702d45c714b11ba42db5beddb5">IOFormat::IOFormat()</a>.</li>
<li><b>EIGEN_INITIALIZE_MATRICES_BY_ZERO</b> - if defined, all entries of newly constructed matrices and arrays are initialized to zero, as are new entries in matrices and arrays after resizing. Not defined by default. <dl class="section warning"><dt>Warning</dt><dd>The unary (resp. binary) constructor of <code>1x1</code> (resp. <code>2x1</code> or <code>1x2</code>) fixed size matrices is always interpreted as an initialization constructor where the argument(s) are the coefficient values and not the sizes. For instance,<div class="fragment"><div class="line"><a class="code" href="group__matrixtypedefs.html#ga6c206cbf6f8f3b74bc63ecd362fc2ad6">Vector2d</a> v(2,1); </div>
<div class="ttc" id="agroup__matrixtypedefs_html_ga6c206cbf6f8f3b74bc63ecd362fc2ad6"><div class="ttname"><a href="group__matrixtypedefs.html#ga6c206cbf6f8f3b74bc63ecd362fc2ad6">Eigen::Vector2d</a></div><div class="ttdeci">Matrix&lt; double, 2, 1 &gt; Vector2d</div><div class="ttdoc">2×1 vector of type double.</div><div class="ttdef"><b>Definition:</b> Matrix.h:501</div></div>
</div><!-- fragment --> will create a vector with coeficients [2,1], and <b>not</b> a <code>2x1</code> vector initialized with zeros (i.e., [0,0]). If such cases might occur, then it is recommended to use the default constructor with a explicit call to resize: <div class="fragment"><div class="line">Matrix&lt;?,SizeAtCompileTime,1&gt; v;</div>
<div class="line">v.resize(size);</div>
<div class="line">Matrix&lt;?,RowsAtCompileTime,ColsAtCompileTime&gt; m;</div>
<div class="line">m.resize(rows,cols);</div>
</div><!-- fragment --></dd></dl>
</li>
<li><b>EIGEN_INITIALIZE_MATRICES_BY_NAN</b> - if defined, all entries of newly constructed matrices and arrays are initialized to NaN, as are new entries in matrices and arrays after resizing. This option is especially useful for debugging purpose, though a memory tool like <a href="http://valgrind.org/">valgrind</a> is preferable. Not defined by default. <dl class="section warning"><dt>Warning</dt><dd>See the documentation of <code>EIGEN_INITIALIZE_MATRICES_BY_ZERO</code> for a discussion on a limitations of these macros when applied to <code>1x1</code>, <code>1x2</code>, and <code>2x1</code> fixed-size matrices.</dd></dl>
</li>
<li><b>EIGEN_NO_AUTOMATIC_RESIZING</b> - if defined, the matrices (or arrays) on both sides of an assignment <code>a = b</code> have to be of the same size; otherwise, Eigen automatically resizes <code>a</code> so that it is of the correct size. Not defined by default.</li>
</ul>
<h1><a class="anchor" id="TopicPreprocessorDirectivesCppVersion"></a>
C++ standard features</h1>
<p>By default, Eigen strive to automatically detect and enable language features at compile-time based on the information provided by the compiler.</p>
<ul>
<li><b>EIGEN_MAX_CPP_VER</b> - disables usage of C++ features requiring a version greater than EIGEN_MAX_CPP_VER. Possible values are: 14, 17, etc. If not defined (the default), Eigen enables all features supported by the compiler.</li>
</ul>
<p>Individual features can be explicitly enabled or disabled by defining the following token to 0 or 1 respectively. For instance, one might limit the C++ version to C++14 by defining EIGEN_MAX_CPP_VER=14, but still enable C99 math functions by defining EIGEN_HAS_C99_MATH=1.</p>
<ul>
<li><b>EIGEN_HAS_C99_MATH</b> - controls the usage of C99 math functions such as erf, erfc, lgamma, etc.</li>
<li><b>EIGEN_HAS_CXX11_MATH</b> - controls the implementation of some functions such as round, logp1, isinf, isnan, etc.</li>
<li><b>EIGEN_HAS_STD_RESULT_OF</b> - defines whether std::result_of is supported</li>
<li><b>EIGEN_NO_IO</b> - Disables any usage and support for <code>&lt;iostreams&gt;</code>.</li>
</ul>
<h1><a class="anchor" id="TopicPreprocessorDirectivesAssertions"></a>
Assertions</h1>
<p>The Eigen library contains many assertions to guard against programming errors, both at compile time and at run time. However, these assertions do cost time and can thus be turned off.</p>
<ul>
<li><b>EIGEN_NO_DEBUG</b> - disables Eigen's assertions if defined. Not defined by default, unless the <code>NDEBUG</code> macro is defined (this is a standard C++ macro which disables all asserts).</li>
<li><b>EIGEN_NO_STATIC_ASSERT</b> - if defined, compile-time static assertions are replaced by runtime assertions; this saves compilation time. Not defined by default.</li>
<li><b>eigen_assert</b> - macro with one argument that is used inside Eigen for assertions. By default, it is basically defined to be <code>assert</code>, which aborts the program if the assertion is violated. Redefine this macro if you want to do something else, like throwing an exception.</li>
<li><b>EIGEN_MPL2_ONLY</b> - disable non MPL2 compatible features, or in other words disable the features which are still under the LGPL.</li>
</ul>
<h1><a class="anchor" id="TopicPreprocessorDirectivesPerformance"></a>
Alignment, vectorization and performance tweaking</h1>
<ul>
<li><b><code>EIGEN_MALLOC_ALREADY_ALIGNED</code> -</b> Can be set to 0 or 1 to tell whether default system <code>malloc</code> already returns aligned buffers. In not defined, then this information is automatically deduced from the compiler and system preprocessor tokens.</li>
<li><b><code>EIGEN_MAX_ALIGN_BYTES</code> -</b> Must be a power of two, or 0. Defines an upper bound on the memory boundary in bytes on which dynamically and statically allocated data may be aligned by Eigen. If not defined, a default value is automatically computed based on architecture, compiler, and OS. This option is typically used to enforce binary compatibility between code/libraries compiled with different SIMD options. For instance, one may compile AVX code and enforce ABI compatibility with existing SSE code by defining <code>EIGEN_MAX_ALIGN_BYTES=16</code>. In the other way round, since by default AVX implies 32 bytes alignment for best performance, one can compile SSE code to be ABI compatible with AVX code by defining <code>EIGEN_MAX_ALIGN_BYTES=32</code>.</li>
<li><b><code>EIGEN_MAX_STATIC_ALIGN_BYTES</code> -</b> Same as <code>EIGEN_MAX_ALIGN_BYTES</code> but for statically allocated data only. By default, if only <code>EIGEN_MAX_ALIGN_BYTES</code> is defined, then <code>EIGEN_MAX_STATIC_ALIGN_BYTES</code> == <code>EIGEN_MAX_ALIGN_BYTES</code>, otherwise a default value is automatically computed based on architecture, compiler, and OS (can be smaller than the default value of EIGEN_MAX_ALIGN_BYTES on architectures that do not support stack alignment). Let us emphasize that <code>EIGEN_MAX_*_ALIGN_BYTES</code> define only a desirable upper bound. In practice data is aligned to largest power-of-two common divisor of <code>EIGEN_MAX_STATIC_ALIGN_BYTES</code> and the size of the data, such that memory is not wasted.</li>
<li><b><code>EIGEN_DONT_PARALLELIZE</code> -</b> if defined, this disables multi-threading. This is only relevant if you enabled OpenMP. See <a class="el" href="TopicMultiThreading.html">Eigen and multi-threading</a> for details.</li>
<li><b><code>EIGEN_DONT_VECTORIZE</code> -</b> disables explicit vectorization when defined. Not defined by default, unless alignment is disabled by Eigen's platform test or the user defining <code>EIGEN_DONT_ALIGN</code>.</li>
<li><b><code>EIGEN_UNALIGNED_VECTORIZE</code> -</b> disables/enables vectorization with unaligned stores. Default is 1 (enabled). If set to 0 (disabled), then expression for which the destination cannot be aligned are not vectorized (e.g., unaligned small fixed size vectors or matrices)</li>
<li><b><code>EIGEN_FAST_MATH</code> -</b> enables some optimizations which might affect the accuracy of the result. This currently enables the SSE vectorization of <a class="el" href="namespaceEigen.html#ae6e8ad270ff41c088d7651567594f796">sin()</a> and <a class="el" href="namespaceEigen.html#ad01d50a42869218f1d54af13f71517a6">cos()</a>, and speedups <a class="el" href="namespaceEigen.html#af4f536e8ea56702e63088efb3706d1f0">sqrt()</a> for single precision. Defined to 1 by default. Define it to 0 to disable.</li>
<li><b><code>EIGEN_UNROLLING_LIMIT</code> -</b> defines the size of a loop to enable meta unrolling. Set it to zero to disable unrolling. The size of a loop here is expressed in Eigen's own notion of "number of FLOPS", it does not correspond to the number of iterations or the number of instructions. The default is value 110.</li>
<li><b><code>EIGEN_STACK_ALLOCATION_LIMIT</code> -</b> defines the maximum bytes for a buffer to be allocated on the stack. For internal temporary buffers, dynamic memory allocation is employed as a fall back. For fixed-size matrices or arrays, exceeding this threshold raises a compile time assertion. Use 0 to set no limit. Default is 128 KB.</li>
<li><b><code>EIGEN_NO_CUDA</code> -</b> disables CUDA support when defined. Might be useful in .cu files for which <a class="el" href="namespaceEigen.html" title="Namespace containing all symbols from the Eigen library.">Eigen</a> is used on the host only, and never called from device code.</li>
<li><b><code>EIGEN_STRONG_INLINE</code> -</b> This macro is used to qualify critical functions and methods that we expect the compiler to inline. By default it is defined to <code>__forceinline</code> for MSVC and ICC, and to <code>inline</code> for other compilers. A tipical usage is to define it to <code>inline</code> for MSVC users wanting faster compilation times, at the risk of performance degradations in some rare cases for which MSVC inliner fails to do a good job.</li>
<li><b><code>EIGEN_DEFAULT_L1_CACHE_SIZE</code> -</b> Sets the default L1 cache size that is used in <a class="el" href="namespaceEigen.html" title="Namespace containing all symbols from the Eigen library.">Eigen</a>'s GEBP kernel when the correct cache size cannot be determined at runtime.</li>
<li><b><code>EIGEN_DEFAULT_L2_CACHE_SIZE</code> -</b> Sets the default L2 cache size that is used in <a class="el" href="namespaceEigen.html" title="Namespace containing all symbols from the Eigen library.">Eigen</a>'s GEBP kernel when the correct cache size cannot be determined at runtime.</li>
<li><b><code>EIGEN_DEFAULT_L3_CACHE_SIZE</code> -</b> Sets the default L3 cache size that is used in <a class="el" href="namespaceEigen.html" title="Namespace containing all symbols from the Eigen library.">Eigen</a>'s GEBP kernel when the correct cache size cannot be determined at runtime.</li>
<li><b><code>EIGEN_DONT_ALIGN</code> -</b> Deprecated, it is a synonym for <code>EIGEN_MAX_ALIGN_BYTES=0</code>. It disables alignment completely. Eigen will not try to align its objects and does not expect that any objects passed to it are aligned. This will turn off vectorization if <b><code>EIGEN_UNALIGNED_VECTORIZE=1</code>.</b> Not defined by default.</li>
<li><b><code>EIGEN_DONT_ALIGN_STATICALLY</code> -</b> Deprecated, it is a synonym for <code>EIGEN_MAX_STATIC_ALIGN_BYTES=0</code>. It disables alignment of arrays on the stack. Not defined by default, unless <code>EIGEN_DONT_ALIGN</code> is defined.</li>
<li><b><code>EIGEN_ALTIVEC_ENABLE_MMA_DYNAMIC_DISPATCH</code> -</b> Controls whether to use <a class="el" href="namespaceEigen.html" title="Namespace containing all symbols from the Eigen library.">Eigen</a>'s dynamic dispatching for Altivec MMA or not.</li>
<li><b><code>EIGEN_ALTIVEC_DISABLE_MMA</code> -</b> Overrides the usage of Altivec MMA instructions.</li>
<li><b><code>EIGEN_ALTIVEC_USE_CUSTOM_PACK</code> -</b> Controls whether to use <a class="el" href="namespaceEigen.html" title="Namespace containing all symbols from the Eigen library.">Eigen</a>'s custom packing for Altivec or not.</li>
</ul>
<h1><a class="anchor" id="TopicPreprocessorDirectivesPlugins"></a>
Plugins</h1>
<p>It is possible to add new methods to many fundamental classes in Eigen by writing a plugin. As explained in the section <a class="el" href="TopicCustomizing_Plugins.html">Extending MatrixBase (and other classes)</a>, the plugin is specified by defining a <code>EIGEN_xxx_PLUGIN</code> macro. The following macros are supported; none of them are defined by default.</p>
<ul>
<li><b>EIGEN_ARRAY_PLUGIN</b> - filename of plugin for extending the <a class="el" href="classEigen_1_1Array.html" title="General-purpose arrays with easy API for coefficient-wise operations.">Array</a> class.</li>
<li><b>EIGEN_ARRAYBASE_PLUGIN</b> - filename of plugin for extending the <a class="el" href="classEigen_1_1ArrayBase.html" title="Base class for all 1D and 2D array, and related expressions.">ArrayBase</a> class.</li>
<li><b>EIGEN_CWISE_PLUGIN</b> - filename of plugin for extending the Cwise class.</li>
<li><b>EIGEN_DENSEBASE_PLUGIN</b> - filename of plugin for extending the <a class="el" href="classEigen_1_1DenseBase.html" title="Base class for all dense matrices, vectors, and arrays.">DenseBase</a> class.</li>
<li><b>EIGEN_DYNAMICSPARSEMATRIX_PLUGIN</b> - filename of plugin for extending the DynamicSparseMatrix class.</li>
<li><b>EIGEN_FUNCTORS_PLUGIN</b> - filename of plugin for adding new functors and specializations of functor_traits.</li>
<li><b>EIGEN_MAPBASE_PLUGIN</b> - filename of plugin for extending the MapBase class.</li>
<li><b>EIGEN_MATRIX_PLUGIN</b> - filename of plugin for extending the <a class="el" href="classEigen_1_1Matrix.html" title="The matrix class, also used for vectors and row-vectors.">Matrix</a> class.</li>
<li><b>EIGEN_MATRIXBASE_PLUGIN</b> - filename of plugin for extending the <a class="el" href="classEigen_1_1MatrixBase.html" title="Base class for all dense matrices, vectors, and expressions.">MatrixBase</a> class.</li>
<li><b>EIGEN_PLAINOBJECTBASE_PLUGIN</b> - filename of plugin for extending the <a class="el" href="classEigen_1_1PlainObjectBase.html" title="Dense storage base class for matrices and arrays.">PlainObjectBase</a> class.</li>
<li><b>EIGEN_QUATERNION_PLUGIN</b> - filename of plugin for extending the <a class="el" href="classEigen_1_1Quaternion.html" title="The quaternion class used to represent 3D orientations and rotations.">Quaternion</a> class.</li>
<li><b>EIGEN_QUATERNIONBASE_PLUGIN</b> - filename of plugin for extending the <a class="el" href="classEigen_1_1QuaternionBase.html" title="Base class for quaternion expressions.">QuaternionBase</a> class.</li>
<li><b>EIGEN_SPARSEMATRIX_PLUGIN</b> - filename of plugin for extending the <a class="el" href="classEigen_1_1SparseMatrix.html" title="A versatible sparse matrix representation.">SparseMatrix</a> class.</li>
<li><b>EIGEN_SPARSEMATRIXBASE_PLUGIN</b> - filename of plugin for extending the <a class="el" href="classEigen_1_1SparseMatrixBase.html" title="Base class of any sparse matrices or sparse expressions.">SparseMatrixBase</a> class.</li>
<li><b>EIGEN_SPARSEVECTOR_PLUGIN</b> - filename of plugin for extending the <a class="el" href="classEigen_1_1SparseVector.html" title="a sparse vector class">SparseVector</a> class.</li>
<li><b>EIGEN_TRANSFORM_PLUGIN</b> - filename of plugin for extending the <a class="el" href="classEigen_1_1Transform.html" title="Represents an homogeneous transformation in a N dimensional space.">Transform</a> class.</li>
<li><b>EIGEN_VECTORWISEOP_PLUGIN</b> - filename of plugin for extending the <a class="el" href="classEigen_1_1VectorwiseOp.html" title="Pseudo expression providing broadcasting and partial reduction operations.">VectorwiseOp</a> class.</li>
</ul>
<h1><a class="anchor" id="TopicPreprocessorDirectivesDevelopers"></a>
Macros for Eigen developers</h1>
<p>These macros are mainly meant for people developing Eigen and for testing purposes. Even though, they might be useful for power users and the curious for debugging and testing purpose, they <b>should</b> <b>not</b> <b>be</b> <b>used</b> by real-word code.</p>
<ul>
<li><b>EIGEN_DEFAULT_TO_ROW_MAJOR</b> - when defined, the default storage order for matrices becomes row-major instead of column-major. Not defined by default.</li>
<li><b>EIGEN_INTERNAL_DEBUGGING</b> - if defined, enables assertions in Eigen's internal routines. This is useful for debugging Eigen itself. Not defined by default.</li>
<li><b>EIGEN_NO_MALLOC</b> - if defined, any request from inside the Eigen to allocate memory from the heap results in an assertion failure. This is useful to check that some routine does not allocate memory dynamically. Not defined by default.</li>
<li><b>EIGEN_RUNTIME_NO_MALLOC</b> - if defined, a new switch is introduced which can be turned on and off by calling <code>set_is_malloc_allowed(bool)</code>. If malloc is not allowed and Eigen tries to allocate memory dynamically anyway, an assertion failure results. Not defined by default. </li>
</ul>
</div></div><!-- contents -->
</div><!-- PageDoc -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="footer">Generated on Thu Apr 21 2022 13:07:55 for Eigen by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.9.1 </li>
  </ul>
</div>
</body>
</html>
